package keyword

import (
	"fmt"
)

/*
	1.3 实现接口的条件
	一个对象只要全部实现了接口中的方法，那么就实现了这个接口。换句话说，接口就是一个需要实现的方法列表。
	举个例子，这里我们定义一个 Phone 对象

*/

// 定义一个枚举
const (
	Low int = iota
	Medium
	High
)

// 定义一个接口
type Phone interface {
	// 打电话功能
	MobileCommunication()
	// 刷抖音功能
	BrushTiktok()
	// 打王者功能
	HonorOfKings([]string)
}

// 定义一个Huawei的结构体
type HUAWEI struct {
	Name     string
	Price    float64
	Function []string
	Cost     int
	Desc     string
}

// 定义一个OPPO的结构体
type OPPO struct {
	Name     string
	Price    float64
	Function []string
	Cost     int
	Desc     string
}

/*
	定义HUAWEI手机的功能
*/
// 打电话功能
func (H *HUAWEI) MobileCommunication() {
	fmt.Println(H.Name, "有电话功能!")
}

// 刷抖音功能
func (H *HUAWEI) BrushTiktok() {
	fmt.Println(H.Name, "有刷视频功能")
}

// 打游戏功能
func (H *HUAWEI) HonorOfKings(heroList []string) {
	for _, hero := range heroList {
		switch hero {
		case "鲁班七号":
			fmt.Println("鲁班七号:借你们肉体，试验一下新发明的威力.\n", H.Name, H.Price, H.Function, H.Cost, H.Desc)
		case "兰陵王":
			fmt.Println("一个人,没有同类。 —— 兰陵王常常独来独往，这句台词表达了他孤独而强大的内心世界.\n", H.Name, H.Price, H.Function, H.Cost, H.Desc)
		case "白起":
			fmt.Println("曾经我也是个普通人,来一个干掉一个,活到最后的才是无敌.\n", H.Name, H.Price, H.Function, H.Cost, H.Desc)
		default:
			fmt.Println("鲁班你怎么又死了!\n", H.Name, H.Price, H.Function, H.Cost, H.Desc)
		}
	}
}

/*
	定义OPPO手机的功能
*/
// 打电话功能
func (O *OPPO) MobileCommunication() {
	fmt.Println(O.Name, O.Price, O.Function, O.Desc, O.Cost, "有电话功能!")
}

// 刷抖音功能
func (O *OPPO) BrushTiktok() {
	fmt.Println(O.Name, O.Price, O.Function, O.Desc, O.Cost, "有刷视频功能")
}

// 打游戏功能
func (O *OPPO) HonorOfKings(heroList []string) {
	for _, hero := range heroList {
		switch hero {
		case "鲁班七号":
			fmt.Println("鲁班七号:借你们肉体，试验一下新发明的威力。", O.Name, O.Price, O.Function, O.Desc, O.Cost)
		case "兰陵王":
			fmt.Println("一个人,没有同类。 —— 兰陵王常常独来独往，这句台词表达了他孤独而强大的内心世界。", O.Name, O.Price, O.Function, O.Desc, O.Cost)
		case "白起":
			fmt.Println("曾经我也是个普通人,来一个干掉一个,活到最后的才是无敌。", O.Name, O.Price, O.Function, O.Desc, O.Cost)
		default:
			fmt.Println("鲁班你怎么又死了!", O.Name, O.Price, O.Function, O.Desc, O.Cost)
		}
	}
}
func InterfacePhone(phone Phone) {
	// 实例化华为mate60
	mate60 := &HUAWEI{
		Name:  "HuaWei-mate60",
		Price: 6999.00,
		Function: []string{
			"打电话", "打游戏", "爬虫",
		},
		Cost: High,
		Desc: "我们遥遥领先,领先同行百分之80%",
	}
	// 实例化Oppo-findPx
	findPx := &OPPO{
		Name:  "OPPO-findPx",
		Price: 16999.00,
		Function: []string{
			"拍照", "ps图", "美图修修",
		},
		Cost: Low,
		Desc: "虽然我卖的很贵,但是只赚女人的钱!",
	}
	// 华为实例化赋值变量
	phone = mate60
	phone.MobileCommunication()
	phone.BrushTiktok()
	phone.HonorOfKings([]string{"鲁班七号", "兰陵王", "白起"})
	fmt.Println("-----------------------")
	// OPPO实例化赋值给变量
	phone = findPx
	phone.MobileCommunication()
	phone.BrushTiktok()
	phone.HonorOfKings([]string{"干将莫邪"})
}

// 实现接口功能
func InterfaceVariableV1() {
	// 声明一个Phone 类型的变量
	var phone Phone
	InterfacePhone(phone)
}
